<!-- Copyright 2013 Google Inc. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// -->
<!DOCTYPE html>
<title>Unit Test of e2e.Hkdf</title>
<script src="../../../../../javascript/closure/base.js"></script>
<script src="test_js_deps-runfiles.js"></script>
<script>
    goog.require('goog.crypt');
    goog.require('goog.testing.jsunit');
    goog.require('e2e.hash.Sha1');
    goog.require('e2e.hash.Sha256');
    goog.require('e2e.Hkdf');
</script>
<script>
    /**
     * Test cases are specified in Appendix A of RFC 5869.
     * @see http://tools.ietf.org/html/rfc5869
     */
    var ikms = [
      '0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b',
      '000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122' +
      '232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445' +
      '464748494a4b4c4d4e4f',
      '0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b',
      '0b0b0b0b0b0b0b0b0b0b0b',
      '000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122' +
      '232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445' +
      '464748494a4b4c4d4e4f',
      '0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b',
      '0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c',
    ];

    var salts = [
      '000102030405060708090a0b0c',
      '606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182' +
      '838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5' +
      'a6a7a8a9aaabacadaeaf',
      '',
      '000102030405060708090a0b0c',
      '606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182' +
      '838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5' +
      'a6a7a8a9aaabacadaeaf',
      ''
    ];

    var infos = [
      'f0f1f2f3f4f5f6f7f8f9',
      'b0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2' +
      'd3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5' +
      'f6f7f8f9fafbfcfdfeff',
      '',
      'f0f1f2f3f4f5f6f7f8f9',
      'b0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2' +
      'd3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5' +
      'f6f7f8f9fafbfcfdfeff',
      '',
      ''
    ];

    var okms = [
      '3cb25f25faacd57a90434f64d0362f2a2d2d0a90cf1a5a4c5db02d56ecc4c5bf340072' +
      '08d5b887185865',
      'b11e398dc80327a1c8e7f78c596a49344f012eda2d4efad8a050cc4c19afa97c59045a' +
      '99cac7827271cb41c65e590e09da3275600c2f09b8367793a9aca3db71cc30c58179ec' +
      '3e87c14c01d5c1f3434f1d87',
      '8da4e775a563c18f715f802a063c5a31b8a11f5c5ee1879ec3454e5f3c738d2d9d2013' +
      '95faa4b61a96c8',
      '085a01ea1b10f36933068b56efa5ad81a4f14b822f5b091568a9cdd4f155fda2c22e42' +
      '2478d305f3f896',
      '0bd770a74d1160f7c9f12cd5912a06ebff6adcae899d92191fe4305673ba2ffe8fa3f1' +
      'a4e5ad79f3f334b3b202b2173c486ea37ce3d397ed034c7f9dfeb15c5e927336d0441f' +
      '4c4300e2cff0d0900b52d3b4',
      '0ac1af7002b3d761d1e55298da9d0506b9ae52057220a306e07b6b87e8df21d0ea0003' +
      '3de03984d34918',
      '2c91117204d745f3500d636a62f64f0ab3bae548aa53d423b0d1f27ebba6f5e5673a08' +
      '1d70cce7acfc48'
    ];

    var extract_lens = [
      42,
      82,
      42,
      42,
      82,
      42,
      42
    ];

    function testShortInputsWithSha256() {
      assertArrayEquals(goog.crypt.hexToByteArray(okms[0]),
                        (new e2e.Hkdf(new e2e.hash.Sha256()))
                            .getHKDF(goog.crypt.hexToByteArray(ikms[0]),
                                     goog.crypt.hexToByteArray(infos[0]),
                                     extract_lens[0],
                                     goog.crypt.hexToByteArray(salts[0])));
    };

    function testLongInputsWithSha256() {
      assertArrayEquals(goog.crypt.hexToByteArray(okms[1]),
                        (new e2e.Hkdf(new e2e.hash.Sha256()))
                            .getHKDF(goog.crypt.hexToByteArray(ikms[1]),
                                     goog.crypt.hexToByteArray(infos[1]),
                                     extract_lens[1],
                                     goog.crypt.hexToByteArray(salts[1])));
    };

    function testZeroLengthSaltInfoWithSha256() {
      assertArrayEquals(goog.crypt.hexToByteArray(okms[2]),
                        (new e2e.Hkdf(new e2e.hash.Sha256()))
                            .getHKDF(goog.crypt.hexToByteArray(ikms[2]),
                                     goog.crypt.hexToByteArray(infos[2]),
                                     extract_lens[2],
                                     goog.crypt.hexToByteArray(salts[2])));
    };

    function testShortInputsWithSha1() {
      assertArrayEquals(goog.crypt.hexToByteArray(okms[3]),
                        (new e2e.Hkdf(new e2e.hash.Sha1()))
                            .getHKDF(goog.crypt.hexToByteArray(ikms[3]),
                                     goog.crypt.hexToByteArray(infos[3]),
                                     extract_lens[3],
                                     goog.crypt.hexToByteArray(salts[3])));
    };

    function testLongInputsWithSha1() {
      assertArrayEquals(goog.crypt.hexToByteArray(okms[4]),
                        (new e2e.Hkdf(new e2e.hash.Sha1()))
                            .getHKDF(goog.crypt.hexToByteArray(ikms[4]),
                                     goog.crypt.hexToByteArray(infos[4]),
                                     extract_lens[4],
                                     goog.crypt.hexToByteArray(salts[4])));
    };

    function testZeroLengthSaltAndInfoWithSha1() {
      assertArrayEquals(goog.crypt.hexToByteArray(okms[5]),
                        (new e2e.Hkdf(new e2e.hash.Sha1()))
                            .getHKDF(goog.crypt.hexToByteArray(ikms[5]),
                                     goog.crypt.hexToByteArray(infos[5]),
                                     extract_lens[5],
                                     goog.crypt.hexToByteArray(salts[5])));
    };

    function testNoSaltAndZeroLengthInfoWithSha1() {
      assertArrayEquals(goog.crypt.hexToByteArray(okms[6]),
                        (new e2e.Hkdf(new e2e.hash.Sha1()))
                            .getHKDF(goog.crypt.hexToByteArray(ikms[6]),
                                     goog.crypt.hexToByteArray(infos[6]),
                                     extract_lens[6]));
    };
</script>
